package com.sokobanboxpro.game.menu;

import com.sokobanboxpro.game.Application;
import com.sokobanboxpro.game.entity.ImageObj;
import com.sokobanboxpro.game.entity.Text;
import com.sokobanboxpro.game.exception.ConfigValueNotFoundException;
import com.sokobanboxpro.game.managers.ActionGameManager;
import com.sokobanboxpro.game.managers.LevelManager;
import com.sokobanboxpro.game.managers.MenuManager;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

/**
 * Меню выбора уровня.
 *
 * @author Esr
 */
public class SelectLevelMenu extends Menu {

		/**
		 * Изображения чисел
		 */
		Image[] numbers = new Image[10];
		/**
		 * Картинка уровня.
		 */
		Image levelBackground;
		/**
		 * Картинка уровня, кторый еще не доступен.
		 */
		Image levelBackgroundDs;
		/**
		 * япустое изображение.
		 */
		ImageObj emptyImage;
		/**
		 * Количество страниц
		 */
		int pagesAmount;
		/**
		 * Номер текущей страницы.
		 */
		int page;

		/**
		 * Создание нового меню.
		 *
		 * @throws ConfigValueNotFoundException
		 * @throws SlickException
		 * @throws Exception
		 */
		public SelectLevelMenu() throws ConfigValueNotFoundException, SlickException, Exception {

				super();
				Image number = new Image(imagePath + "level_font.png");
				for (int i = 0; i < 10; i++) {
						numbers[i] = number.getSubImage(10 * i, 0, 10, 10);
				}
				levelBackground = new Image(imagePath + "level_background.png");
				levelBackgroundDs = new Image(imagePath + "level_background_ds.png");
				int levelAmount = LevelManager.levelAmount();
				pagesAmount = (int) (levelAmount / 20) + 1;
				texts = new Text[2];
				texts[0] = new Text("", 0, 0);
				texts[1] = new Text("", 0, 0);
				images = new ImageObj[65];
				images[0] = new ImageObj(imagePath + "background_selectlevel.png", 0, 0);
				images[1] = new ImageObj(imagePath + "arrow-left.png", 50, 380);
				images[2] = new ImageObj(imagePath + "arrow-right.png", 650, 380);
				images[3] = new ImageObj(imagePath + "skip.png", 450, 380);
				images[4] = new ImageObj(imagePath + "back.png", 250, 380);
				emptyImage = new ImageObj(numbers[0], -100, -100);
				for (int i = 5; i < 65; i++) {
						images[i] = emptyImage;
				}
				changePage(0);

		}

		/**
		 * Изменить страницу.
		 *
		 * @param page Номер страницы
		 * @throws Exception
		 */
		public final void changePage(int page) throws Exception {
				if (page >= pagesAmount || page < 0) {
						throw new Exception("Нет такой страницы");
				}

				for (int i = 5; i < 65; i++) {
						images[i] = emptyImage;
				}

				this.page = page;

				for (int i = 0; i < 10 && (page) * 20 + i < LevelManager.levelAmount(); i++) {

						if (i + page * 20 < ActionGameManager.game.getLevelsComplite()) {
								images[5 + i] = new ImageObj(levelBackground, i * 60 + 100, 100);
						} else {
								images[5 + i] = new ImageObj(levelBackgroundDs, i * 60 + 100, 100);
						}
						images[45 + i] = new ImageObj(numbers[i / 10 + page * 2], i * 60 + 100 + 4, 100 + 6);
						images[25 + i] = new ImageObj(numbers[i % 10], i * 60 + 110 + 4, 100 + 6);


				}

				for (int i = 10; i < 20 && (page) * 20 + i < LevelManager.levelAmount(); i++) {

						if (i + page * 20 < ActionGameManager.game.getLevelsComplite()) {
								images[5 + i] = new ImageObj(levelBackground, (i - 10) * 60 + 100, 200);
						} else {
								images[5 + i] = new ImageObj(levelBackgroundDs, (i - 10) * 60 + 100, 200);
						}
						images[45 + i] = new ImageObj(numbers[i / 10 + page * 2], (i - 10) * 60 + 100 + 4, 200 + 6);
						images[25 + i] = new ImageObj(numbers[i % 10], (i - 10) * 60 + 110 + 5, 200 + 6);


				}

				texts[0] = new Text("world " + (page + 1), 100, 10);
				texts[1] = new Text("skip " + ActionGameManager.game.getSkips(), 200, 10);

		}

		/**
		 * Изменить страницу на предыдушию.
		 */
		public void changeToPreweivPage() {
				try {
						changePage(page - 1);
				} catch (Exception ex) {
				}
		}

		/**
		 * Изменить страницу на следующию.
		 */
		public void changeToNextPage() {
				try {
						changePage(page + 1);
				} catch (Exception ex) {
				}
		}

		/**
		 * Функция ывзываемая при обновление меню.
		 */
		@Override
		public void update() {
		}

		/**
		 * Нажатие мыши или касание экрана.
		 *
		 * @param x Координата x
		 * @param y Координата y
		 */
		@Override
		public void mousePressed(int x, int y) throws Exception {
				if (checkPointInImage(x, y, images[1])) {
						changeToPreweivPage();
				} else if (checkPointInImage(x, y, images[2])) {
						changeToNextPage();
				} else if (checkPointInImage(x, y, images[3])) {
						ActionGameManager.game.skipLevel();
						try {
								changePage(page);
						} catch (Exception ex) {
						}
				} else if (checkPointInImage(x, y, images[4])) {
						MenuManager.setMenu(MenuEnum.MAIN_MENU);
				} else {
						for (int i = 0; i < 20 && (page) * 20 + i < LevelManager.levelAmount() && (page) * 20 + i < ActionGameManager.game.getLevelsComplite(); i++) {
								if (checkPointInImage(x, y, images[i + 5])) {
										Application.setStateGame();
										ActionGameManager.game.changeLevel(i);
										return;
								}

						}


				}
		}

		/**
		 * Функция, вызываемая при изменение состояния приложения.
		 */
		@Override
		public void changeState() {
				try {
						changePage(page);
				} catch (Exception ex) {
				}
		}

}
